1 module directx.d3d11shadertracing; 2 3 version(Windows): 4 version(Direct3D_11): 5 6 import directx.d3d11shader; 7 8 extern(C) { 9 10 enum D3D11_SHADER_TYPE 11 { 12 D3D11_VERTEX_SHADER = 1, 13 D3D11_HULL_SHADER = 2, 14 D3D11_DOMAIN_SHADER = 3, 15 D3D11_GEOMETRY_SHADER = 4, 16 D3D11_PIXEL_SHADER = 5, 17 D3D11_COMPUTE_SHADER = 6 18 } 19 20 enum D3D11_TRACE_COMPONENT_X = 0x1; 21 enum D3D11_TRACE_COMPONENT_Y = 0x2; 22 enum D3D11_TRACE_COMPONENT_Z = 0x4; 23 enum D3D11_TRACE_COMPONENT_W = 0x8; 24 alias D3D11_TRACE_COMPONENT_MASK = UINT8; 25 26 struct D3D11_VERTEX_SHADER_TRACE_DESC 27 { 28 UINT64 Invocation; 29 } 30 31 struct D3D11_HULL_SHADER_TRACE_DESC 32 { 33 UINT64 Invocation; 34 } 35 36 struct D3D11_DOMAIN_SHADER_TRACE_DESC 37 { 38 UINT64 Invocation; 39 } 40 41 struct D3D11_GEOMETRY_SHADER_TRACE_DESC 42 { 43 UINT64 Invocation; 44 } 45 46 struct D3D11_PIXEL_SHADER_TRACE_DESC 47 { 48 UINT64 Invocation; 49 INT X; 50 INT Y; 51 UINT64 SampleMask; 52 } 53 54 struct D3D11_COMPUTE_SHADER_TRACE_DESC 55 { 56 UINT64 Invocation; 57 UINT[3] ThreadIDInGroup; 58 UINT[3] ThreadGroupID; 59 } 60 61 enum D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_WRITES = 0x1; 62 enum D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_READS = 0x2; 63 64 struct D3D11_SHADER_TRACE_DESC 65 { 66 D3D11_SHADER_TYPE Type; 67 UINT Flags; 68 union 69 { 70 D3D11_VERTEX_SHADER_TRACE_DESC VertexShaderTraceDesc; 71 D3D11_HULL_SHADER_TRACE_DESC HullShaderTraceDesc; 72 D3D11_DOMAIN_SHADER_TRACE_DESC DomainShaderTraceDesc; 73 D3D11_GEOMETRY_SHADER_TRACE_DESC GeometryShaderTraceDesc; 74 D3D11_PIXEL_SHADER_TRACE_DESC PixelShaderTraceDesc; 75 D3D11_COMPUTE_SHADER_TRACE_DESC ComputeShaderTraceDesc; 76 } 77 } 78 79 alias DWORD D3D11_TRACE_GS_INPUT_PRIMITIVE; 80 enum : D3D11_TRACE_GS_INPUT_PRIMITIVE 81 { 82 D3D11_TRACE_GS_INPUT_PRIMITIVE_UNDEFINED = 0, 83 D3D11_TRACE_GS_INPUT_PRIMITIVE_POINT = 1, 84 D3D11_TRACE_GS_INPUT_PRIMITIVE_LINE = 2, 85 D3D11_TRACE_GS_INPUT_PRIMITIVE_TRIANGLE = 3, 86 D3D11_TRACE_GS_INPUT_PRIMITIVE_LINE_ADJ = 6, 87 D3D11_TRACE_GS_INPUT_PRIMITIVE_TRIANGLE_ADJ = 7 88 } 89 90 struct D3D11_TRACE_STATS 91 { 92 D3D11_SHADER_TRACE_DESC TraceDesc; 93 UINT8 NumInvocationsInStamp; 94 UINT8 TargetStampIndex; 95 UINT NumTraceSteps; 96 D3D11_TRACE_COMPONENT_MASK[32] InputMask; 97 D3D11_TRACE_COMPONENT_MASK[32] OutputMask; 98 UINT16 NumTemps; 99 UINT16 MaxIndexableTempIndex; 100 UINT16[4096] IndexableTempSize; 101 UINT16 ImmediateConstantBufferSize; 102 UINT[4][2] PixelPosition; 103 UINT64[4] PixelCoverageMask; 104 UINT64[4] PixelDiscardedMask; 105 UINT64[4] PixelCoverageMaskAfterShader; 106 UINT64[4] PixelCoverageMaskAfterA2CSampleMask; 107 UINT64[4] PixelCoverageMaskAfterA2CSampleMaskDepth; 108 UINT64[4] PixelCoverageMaskAfterA2CSampleMaskDepthStencil; 109 BOOL PSOutputsDepth; 110 BOOL PSOutputsMask; 111 D3D11_TRACE_GS_INPUT_PRIMITIVE GSInputPrimitive; 112 BOOL GSInputsPrimitiveID; 113 D3D11_TRACE_COMPONENT_MASK[32] HSOutputPatchConstantMask; 114 D3D11_TRACE_COMPONENT_MASK[32] DSInputPatchConstantMask; 115 } 116 117 struct D3D11_TRACE_VALUE 118 { 119 UINT[4] Bits; 120 D3D11_TRACE_COMPONENT_MASK ValidMask; 121 } 122 123 alias DWORD D3D11_TRACE_REGISTER_TYPE; 124 enum : D3D11_TRACE_REGISTER_TYPE 125 { 126 D3D11_TRACE_OUTPUT_NULL_REGISTER = 0, 127 D3D11_TRACE_INPUT_REGISTER = ( D3D11_TRACE_OUTPUT_NULL_REGISTER + 1 ) , 128 D3D11_TRACE_INPUT_PRIMITIVE_ID_REGISTER = ( D3D11_TRACE_INPUT_REGISTER + 1 ) , 129 D3D11_TRACE_IMMEDIATE_CONSTANT_BUFFER = ( D3D11_TRACE_INPUT_PRIMITIVE_ID_REGISTER + 1 ) , 130 D3D11_TRACE_TEMP_REGISTER = ( D3D11_TRACE_IMMEDIATE_CONSTANT_BUFFER + 1 ) , 131 D3D11_TRACE_INDEXABLE_TEMP_REGISTER = ( D3D11_TRACE_TEMP_REGISTER + 1 ) , 132 D3D11_TRACE_OUTPUT_REGISTER = ( D3D11_TRACE_INDEXABLE_TEMP_REGISTER + 1 ) , 133 D3D11_TRACE_OUTPUT_DEPTH_REGISTER = ( D3D11_TRACE_OUTPUT_REGISTER + 1 ) , 134 D3D11_TRACE_CONSTANT_BUFFER = ( D3D11_TRACE_OUTPUT_DEPTH_REGISTER + 1 ) , 135 D3D11_TRACE_IMMEDIATE32 = ( D3D11_TRACE_CONSTANT_BUFFER + 1 ) , 136 D3D11_TRACE_SAMPLER = ( D3D11_TRACE_IMMEDIATE32 + 1 ) , 137 D3D11_TRACE_RESOURCE = ( D3D11_TRACE_SAMPLER + 1 ) , 138 D3D11_TRACE_RASTERIZER = ( D3D11_TRACE_RESOURCE + 1 ) , 139 D3D11_TRACE_OUTPUT_COVERAGE_MASK = ( D3D11_TRACE_RASTERIZER + 1 ) , 140 D3D11_TRACE_STREAM = ( D3D11_TRACE_OUTPUT_COVERAGE_MASK + 1 ) , 141 D3D11_TRACE_THIS_POINTER = ( D3D11_TRACE_STREAM + 1 ) , 142 D3D11_TRACE_OUTPUT_CONTROL_POINT_ID_REGISTER = ( D3D11_TRACE_THIS_POINTER + 1 ) , 143 D3D11_TRACE_INPUT_FORK_INSTANCE_ID_REGISTER = ( D3D11_TRACE_OUTPUT_CONTROL_POINT_ID_REGISTER + 1 ) , 144 D3D11_TRACE_INPUT_JOIN_INSTANCE_ID_REGISTER = ( D3D11_TRACE_INPUT_FORK_INSTANCE_ID_REGISTER + 1 ) , 145 D3D11_TRACE_INPUT_CONTROL_POINT_REGISTER = ( D3D11_TRACE_INPUT_JOIN_INSTANCE_ID_REGISTER + 1 ) , 146 D3D11_TRACE_OUTPUT_CONTROL_POINT_REGISTER = ( D3D11_TRACE_INPUT_CONTROL_POINT_REGISTER + 1 ) , 147 D3D11_TRACE_INPUT_PATCH_CONSTANT_REGISTER = ( D3D11_TRACE_OUTPUT_CONTROL_POINT_REGISTER + 1 ) , 148 D3D11_TRACE_INPUT_DOMAIN_POINT_REGISTER = ( D3D11_TRACE_INPUT_PATCH_CONSTANT_REGISTER + 1 ) , 149 D3D11_TRACE_UNORDERED_ACCESS_VIEW = ( D3D11_TRACE_INPUT_DOMAIN_POINT_REGISTER + 1 ) , 150 D3D11_TRACE_THREAD_GROUP_SHARED_MEMORY = ( D3D11_TRACE_UNORDERED_ACCESS_VIEW + 1 ) , 151 D3D11_TRACE_INPUT_THREAD_ID_REGISTER = ( D3D11_TRACE_THREAD_GROUP_SHARED_MEMORY + 1 ) , 152 D3D11_TRACE_INPUT_THREAD_GROUP_ID_REGISTER = ( D3D11_TRACE_INPUT_THREAD_ID_REGISTER + 1 ) , 153 D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_REGISTER = ( D3D11_TRACE_INPUT_THREAD_GROUP_ID_REGISTER + 1 ) , 154 D3D11_TRACE_INPUT_COVERAGE_MASK_REGISTER = ( D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_REGISTER + 1 ) , 155 D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER = ( D3D11_TRACE_INPUT_COVERAGE_MASK_REGISTER + 1 ) , 156 D3D11_TRACE_INPUT_GS_INSTANCE_ID_REGISTER = ( D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER + 1 ) , 157 D3D11_TRACE_OUTPUT_DEPTH_GREATER_EQUAL_REGISTER = ( D3D11_TRACE_INPUT_GS_INSTANCE_ID_REGISTER + 1 ) , 158 D3D11_TRACE_OUTPUT_DEPTH_LESS_EQUAL_REGISTER = ( D3D11_TRACE_OUTPUT_DEPTH_GREATER_EQUAL_REGISTER + 1 ) , 159 D3D11_TRACE_IMMEDIATE64 = ( D3D11_TRACE_OUTPUT_DEPTH_LESS_EQUAL_REGISTER + 1 ) , 160 D3D11_TRACE_INPUT_CYCLE_COUNTER_REGISTER = ( D3D11_TRACE_IMMEDIATE64 + 1 ) , 161 D3D11_TRACE_INTERFACE_POINTER = ( D3D11_TRACE_INPUT_CYCLE_COUNTER_REGISTER + 1 ) 162 } 163 164 enum D3D11_TRACE_REGISTER_FLAGS_RELATIVE_INDEXING = 0x1; 165 struct D3D11_TRACE_REGISTER 166 { 167 D3D11_TRACE_REGISTER_TYPE RegType; 168 union 169 { 170 UINT16 Index1D; 171 UINT16[2] Index2D; 172 } 173 UINT8 OperandIndex; 174 UINT8 Flags; 175 } 176 177 enum D3D11_TRACE_MISC_GS_EMIT = 0x1; 178 enum D3D11_TRACE_MISC_GS_CUT = 0x2; 179 enum D3D11_TRACE_MISC_PS_DISCARD = 0x4; 180 enum D3D11_TRACE_MISC_GS_EMIT_STREAM = 0x8; 181 enum D3D11_TRACE_MISC_GS_CUT_STREAM = 0x10; 182 enum D3D11_TRACE_MISC_HALT = 0x20; 183 enum D3D11_TRACE_MISC_MESSAGE = 0x40; 184 alias D3D11_TRACE_MISC_OPERATIONS_MASK = UINT16; 185 186 struct D3D11_TRACE_STEP 187 { 188 UINT ID; 189 BOOL InstructionActive; 190 UINT8 NumRegistersWritten; 191 UINT8 NumRegistersRead; 192 D3D11_TRACE_MISC_OPERATIONS_MASK MiscOperations; 193 UINT OpcodeType; 194 UINT64 CurrentGlobalCycle; 195 } 196 197 mixin( uuid!(ID3D11ShaderTrace, "36b013e6-2811-4845-baa7-d623fe0df104") ); 198 interface ID3D11ShaderTrace : IUnknown 199 { 200 extern(Windows): 201 public: 202 HRESULT TraceReady( 203 /*out*/ UINT64* pTestCount); 204 205 void ResetTrace(); 206 207 HRESULT GetTraceStats( 208 /*out*/ D3D11_TRACE_STATS* pTraceStats); 209 210 HRESULT PSSelectStamp( 211 UINT stampIndex); 212 213 HRESULT GetInitialRegisterContents( 214 D3D11_TRACE_REGISTER *pRegister, 215 /*out*/ D3D11_TRACE_VALUE* pValue) ; 216 217 HRESULT GetStep( 218 UINT stepIndex, 219 /*out*/ D3D11_TRACE_STEP* pTraceStep); 220 221 HRESULT GetWrittenRegister( 222 UINT stepIndex, 223 UINT writtenRegisterIndex, 224 /*out*/ D3D11_TRACE_REGISTER* pRegister, 225 /*out*/ D3D11_TRACE_VALUE* pValue); 226 227 HRESULT GetReadRegister( 228 UINT stepIndex, 229 UINT readRegisterIndex, 230 /*out*/ D3D11_TRACE_REGISTER* pRegister, 231 /*out*/ D3D11_TRACE_VALUE* pValue); 232 } 233 234 mixin( uuid!(ID3D11ShaderTraceFactory, "1fbad429-66ab-41cc-9617-667ac10e4459") ); 235 interface ID3D11ShaderTraceFactory : IUnknown 236 { 237 extern(Windows): 238 HRESULT CreateShaderTrace( 239 IUnknown pShader, 240 D3D11_SHADER_TRACE_DESC* pTraceDesc, 241 /*out*/ ID3D11ShaderTrace* ppShaderTrace); 242 243 } 244 245 246 extern(Windows): 247 HRESULT D3DDisassemble11Trace( LPCVOID pSrcData, 248 SIZE_T SrcDataSize, 249 ID3D11ShaderTrace pTrace, 250 UINT StartStep, 251 UINT NumSteps, 252 UINT Flags, 253 /*out*/ID3D10Blob* ppDisassembly); 254 }